package com.itbaizhan.myconsumer1;

import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import java.io.IOException;
/*在RabbitMQ中，多个消费者监听同一条队列，则队列默认采用的轮询分发。
但是在某种场景下这种策略并不是很好，例如消费者1处理任务的速度非常快，
而其他消费者处理速度却很慢。此时如果采用公平分发，
则消费者1有很大一部分时间处于空闲状态。此时可以采用不公平分发，
即谁处理的快，谁处理的消息多。*/
//多个消费者监听同一队列
@Component
public class UnfairConsumer {

   // @RabbitListener(queues = "my_queue")
    public void listenMessage1(Message message, Channel channel) throws InterruptedException, IOException {


        try{
            //获取消息
            System.out.println("消费者1"+new String(message.getBody(),"UTF-8"));
            //模拟业务，处理一条消息要3秒
            Thread.sleep(3000);
            //签收消息
            /*签收消息
             * 参数1： 消息投递序号
             * 参数2：是否一次可以签收多条消息*/
            channel.basicAck(message.getMessageProperties().getDeliveryTag(),true);
        }catch (Exception e){
            System.out.println("消息发送失败！");
            Thread.sleep(3000);
            /*
             * 参数1： 消息投递序号
             * 参数2：是否一次可以拒签多条消息
             * 参数3：拒签后是否返回队列*/
            channel.basicNack(message.getMessageProperties().getDeliveryTag(),true,true);

        }
    }


   // @RabbitListener(queues = "my_queue")
    public void listenMessage2(Message message, Channel channel) throws InterruptedException, IOException {


        try{
            //获取消息
            System.out.println("消费者2"+new String(message.getBody(),"UTF-8"));
            //模拟业务，处理一条消息要1秒
            Thread.sleep(1000);
            //签收消息
            /*签收消息
             * 参数1： 消息投递序号
             * 参数2：是否一次可以签收多条消息*/
            channel.basicAck(message.getMessageProperties().getDeliveryTag(),true);
        }catch (Exception e){
            System.out.println("消息发送失败！");
            Thread.sleep(1000);
            /*
             * 参数1： 消息投递序号
             * 参数2：是否一次可以拒签多条消息
             * 参数3：拒签后是否返回队列*/
            channel.basicNack(message.getMessageProperties().getDeliveryTag(),true,true);

        }
    }
}
/*消费端配置不公平分发

spring:
  rabbitmq:
   host: 192.168.0.162
   port: 5672
   username: itbaizhan
   password: itbaizhan
   virtual-host: /
   listener:
    simple:
    # 限流机制必须开启手动签收
     acknowledge-mode: manual
    # 消费端最多拉取1条消息消费，这样谁处理的快谁拉取下一条消息，实现了不公平分发
     prefetch: 1*/